package main
import (
	"fmt"
	_"time"
	"errors"
	"strings"
)
//异常错误处理 //采用 defer recover panic 来处理；
//Go中抛出panic异常，然后在defer中通过recover来捕获异常并正常处理！main后面的程序能够继续正常执行~~~~
func errtest(){
	//defer + recover 来捕获异常panic ! 利用匿名函数！
	defer func (){
		err := recover() //recover 内置函数 可以捕获异常panic
		if err != nil{
			fmt.Println("捕获到errtest函数有异常，请及时处理！")
		}
	}()
	num1 := 10
	num2 := 0
	res := num1 / num2
	fmt.Println("res = ",res)
}

//读取配置文件信息 init.conf ，如果文件传入不正确就返回自定义错误
func readconf(name string)(err error){
	if name == "config.ini" {
		return nil
	}else {
		return errors.New("文件传入错误！！！")
	}
}
func testreadconf(){
	err := readconf("config.ini")
	if err != nil {
		//如果读取文件发送错误，就输出这个错误，并且终止程序
		panic(err)
	}
	fmt.Println("testreadconf()...")
}

//判断上传文件格式，若不按要求的格式就报错！
func checkSuffix(suffix string) func (string) error {
	return func (name string) (err error){
		if !strings.HasSuffix(name,suffix){
			return errors.New("文件格式不匹配！请重新上传！")  //若文件后缀不是.conf就报错，返回一个err
		}else{
			return nil
		}
	}
}
func checkError(filename string){
	checkfunction := checkSuffix(".conf")
	err := checkfunction(filename)
	if err != nil {
		panic(err)  //若有生成err返回就用panic输出到控制台，并终止程序
	}else{
		fmt.Println("文件格式正确，正在上传...")
	}
}
func main(){
	//错误测试
	errtest()
	// for {
	// 	fmt.Println("go golang")
	// 	time.Sleep(time.Second)
	// }
	
	//自定义异常错误处理 : errors.New("错误说明") / panic内置函数
	//errors.New("..."),会返回一个error类型的值，表示一个错误
	//panic内置函数，接收一个interface{}类型的值(也就是任何值了)作为参数，可以接收error类型的变量，输出错误信息，并退出程序！
	testreadconf()
	fmt.Println("...")

	//测试上传文件格式异常
	checkError("setting.conf")   //
	fmt.Println("main...")
}